package com.example.leetcode;

/**
 * @Date 2023/2/26
 * @Author Jonathan
 */
public class Code03 {

    public static void main(String[] args) {
        Code03 code03 = new Code03();
        System.out.println(code03.lengthOfLongestSubstring("abcabcbb"));
    }

    public int lengthOfLongestSubstring(String s) {
        if (s == null || s.isEmpty()) {
            return 0;
        }
        int l = 0, r = 0; // 初始值是0
        int[] myHash = new int[500];
        int ans = -99;
        while (l < s.length() && r < s.length()) {

            if (myHash[s.charAt(r)] == 0) {
                myHash[s.charAt(r)]++;
                r++;
                ans = Integer.max(ans, r - l);
            } else {
                // 知道到这个分支说明 s.charAt(r) 已经出现过了
                // 现在需要移动左指针
                while (l < r && s.charAt(l) != s.charAt(r)) {
                    // 这说明在两个指针之间已经出现过了右指针指向的值
                    // 此时需要将左指针移动到中间这个出现过的值
                    myHash[s.charAt(l)]--;
                    l++;
                }
                // 此时是左指针的值和右指针的值相等
                myHash[s.charAt(l)]--;
                l++;
            }
        }
        return ans;
    }
}
